www.gusucode.com > VC++网络版的打字软件源程序-源码程序 > VC++网络版的打字软件源程序-源码程序\code\TypeClt V2.0\Keyboard.cpp
// Keyboard.cpp: implementation of the CKeyboard class. // Download by http://www.NewXing.com ////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include "type.h" #include "Keyboard.h" #ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[]=__FILE__; #define new DEBUG_NEW #endif #define COLOR_L1 RGB(169,255,0) #define COLOR_L2 RGB(255,169,169) #define COLOR_L3 RGB(169,255,169) #define COLOR_L4 RGB(169,169,255) #define COLOR_R1 RGB(192,255,0) #define COLOR_R2 RGB(255,192,192) #define COLOR_R3 RGB(192,255,192) #define COLOR_R4 RGB(192,192,255) #define COLOR_CUR RGB(196,196,196) ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// CKeyboard::CKeyboard() { //control row m_cChar=' '; //first row AddKey(0x00,0x00,1); //signal row change AddKey('`','~',10); AddKey('1','!',10); AddKey('2','@',10); AddKey('3','#',10); AddKey('4','$',10); AddKey('5','%',10); AddKey('6','^',10); AddKey('7','&',10); AddKey('8','*',10); AddKey('9','(',10); AddKey('0',')',10); AddKey('-','_',10); AddKey('=','+',10); AddKey(0x00,VK_BACK,-14); //backspace //second row AddKey(0x00,0x00,2); //signal row change AddKey(0x00,VK_TAB,14); //tab AddKey('q','Q',10,FINGER_LEFT_4); AddKey('w','W',10,FINGER_LEFT_3); AddKey('e','E',10,FINGER_LEFT_2); AddKey('r','R',10,FINGER_LEFT_1); AddKey('t','T',10,FINGER_LEFT_1); AddKey('y','Y',10,FINGER_RIGHT_1); AddKey('u','U',10,FINGER_RIGHT_1); AddKey('i','I',10,FINGER_RIGHT_2); AddKey('o','O',10,FINGER_RIGHT_3); AddKey('p','P',10,FINGER_RIGHT_4); AddKey('[','{',10); AddKey(']','}',10); AddKey('\\','|',-10); //third row AddKey(0x00,0x00,3); //signal row change AddKey(0x00,VK_CAPITAL,18); //caps lock AddKey('a','A',10,FINGER_LEFT_4); AddKey('s','S',10,FINGER_LEFT_3); AddKey('d','D',10,FINGER_LEFT_2); AddKey('f','F',10,FINGER_LEFT_1); AddKey('g','G',10,FINGER_LEFT_1); AddKey('h','H',10,FINGER_RIGHT_1); AddKey('j','J',10,FINGER_RIGHT_1); AddKey('k','K',10,FINGER_RIGHT_2); AddKey('l','L',10,FINGER_RIGHT_3); AddKey(';',':',10,FINGER_RIGHT_4); AddKey('\'','\"',10); AddKey(0x00,VK_RETURN,-16); //enter //fourth row AddKey(0x00,0x00,4); //signal row change AddKey(0x00,VK_SHIFT,22); //left shift AddKey('z','Z',10,FINGER_LEFT_4); AddKey('x','X',10,FINGER_LEFT_3); AddKey('c','C',10,FINGER_LEFT_2); AddKey('v','V',10,FINGER_LEFT_1); AddKey('b','B',10,FINGER_LEFT_1); AddKey('n','N',10,FINGER_RIGHT_1); AddKey('m','M',10,FINGER_RIGHT_1); AddKey(',','<',10,FINGER_RIGHT_2); AddKey('.','>',10,FINGER_RIGHT_3); AddKey('/','?',10,FINGER_RIGHT_4); AddKey(0x00,VK_SHIFT,-22); //shift //fifth row AddKey(0x00,0x00,5); //signal row change AddKey(0x00,VK_CONTROL,12); //ctrl AddKey(0x00,VK_LWIN,12); //window AddKey(0x00,VK_MENU,12); //alt AddKey(' ',' ',60); AddKey(0x00,VK_MENU,12);//alt AddKey(0x00,VK_RWIN,12);//window AddKey(0x00,VK_APPS,11);//App AddKey(0x00,VK_CONTROL,-12);//ctrl; CRect rc(0,0,200,60); Init(rc); } CKeyboard::~CKeyboard() { POSITION pos = m_Keys.GetHeadPosition(); while(pos) { delete m_Keys.GetNext(pos); } } void CKeyboard::AddKey(char cNormal, char cShifted, int nWidth, int nFinger) { KEYDEF* pKey=new KEYDEF; pKey->cNormal=cNormal; pKey->cShifted=cShifted; pKey->nWidth=nWidth; pKey->nFinger=nFinger; m_Keys.AddTail(pKey); } void CKeyboard::CalcWidthHeight() { m_nKeyHeight=0; m_nKeyWidth=0; KEYDEF* pKey; POSITION pos=m_Keys.GetHeadPosition(); long totalWidth=0; long longest=0; long rows=0; while(pos) { pKey=m_Keys.GetNext(pos); if((pKey->cNormal==0x00)&&(pKey->cShifted==0x00)) { rows++; if(totalWidth>longest) { longest=totalWidth; } totalWidth=0; } else { totalWidth+=abs(pKey->nWidth); } } m_nKeyHeight=m_Rect.Height()/rows; m_nKeyWidth=(int)(((double)m_Rect.Width())/(((double)longest)/15)); } void CKeyboard::DrawKey(CDC *pDC, CRect &rc, KEYDEF *pKey, int nFlag) { COLORREF clf=GetSysColor(COLOR_3DFACE); if(nFlag==0) { rc.DeflateRect(1,1); switch(pKey->nFinger) { case FINGER_LEFT_1: clf=COLOR_L1; break; case FINGER_RIGHT_1: clf=COLOR_R1; break; case FINGER_LEFT_2: clf=COLOR_L2; break; case FINGER_RIGHT_2: clf=COLOR_R2; break; case FINGER_LEFT_3: clf=COLOR_L3; break; case FINGER_RIGHT_3: clf=COLOR_R3; break; case FINGER_LEFT_4: clf=COLOR_L4; break; case FINGER_RIGHT_4: clf=COLOR_R4; break; } pDC->FillSolidRect(rc,clf); pDC->Draw3dRect(rc,GetSysColor(COLOR_3DSHADOW),GetSysColor(COLOR_3DDKSHADOW)); rc.DeflateRect(1,1); pDC->Draw3dRect(rc,GetSysColor(COLOR_3DLIGHT),GetSysColor(COLOR_3DSHADOW)); } else { rc.DeflateRect(1,1); clf=COLOR_CUR; pDC->FillSolidRect(rc,clf); pDC->Draw3dRect(rc,GetSysColor(COLOR_3DSHADOW),GetSysColor(COLOR_3DDKSHADOW)); rc.DeflateRect(2,2); pDC->Draw3dRect(rc,GetSysColor(COLOR_3DLIGHT),GetSysColor(COLOR_3DSHADOW)); rc.DeflateRect(1,1); pDC->Draw3dRect(rc,GetSysColor(COLOR_3DSHADOW),GetSysColor(COLOR_3DDKSHADOW)); } rc.DeflateRect(3,1); if(pKey->cNormal == 0x00) { CString label = " "; switch(pKey->cShifted) { case VK_TAB: label = "Tab->"; break; case VK_CAPITAL: label = "Caps"; break; case VK_SHIFT: label = "Shift"; break; case VK_CONTROL: label = "Ctrl"; break; case VK_BACK: label = "<-Bspc"; break; case VK_RETURN: label = "Enter"; break; case VK_MENU: label = "Alt"; break; case VK_LWIN: case VK_RWIN: label = "Wnd"; break; case VK_APPS: label = "App"; break; case VK_ESCAPE: label = "Esc"; break; default: ASSERT(FALSE); label = "#ERR#"; break; } CSize tsize; tsize = pDC->GetTextExtent(label); pDC->TextOut( ((rc.left + rc.right)/2) - (tsize.cx/2), ((rc.top + rc.bottom)/2) - (tsize.cy/2), label); } else { if((pKey->cShifted >= 'A') && (pKey->cShifted <= 'Z')) { CSize tsize; tsize = pDC->GetTextExtent(pKey->cShifted); pDC->TextOut( ((rc.left + rc.right)/2) - (tsize.cx/2), ((rc.top + rc.bottom)/2) - (tsize.cy/2), pKey->cShifted); if(pKey->cShifted=='F' || pKey->cShifted=='J') { pDC->MoveTo( ((rc.left+rc.right)/2)-(tsize.cx/2), ((rc.top+rc.bottom)/2)+(tsize.cy/2)); pDC->LineTo( ((rc.left+rc.right)/2)+(tsize.cx/2), ((rc.top+rc.bottom)/2)+(tsize.cy/2)); } } else { CSize tsize; tsize = pDC->GetTextExtent('M'); pDC->TextOut(rc.left, rc.top, pKey->cShifted); pDC->TextOut( rc.right - tsize.cx, rc.bottom - tsize.cy, pKey->cNormal); } } } void CKeyboard::DrawKeyboard(CDC* pDC,CRect& rc) { Init(rc);//初始化键盘 pDC->FillSolidRect(m_Rect,GetSysColor(COLOR_3DFACE)); int nBM=pDC->SetBkMode(TRANSPARENT); int x = m_Rect.left; int y = m_Rect.top-m_nKeyHeight; int nFlag=0; KEYDEF * pKey; POSITION pos = m_Keys.GetHeadPosition(); while(pos) { pKey = m_Keys.GetNext(pos); if((pKey->cNormal == 0x00) && (pKey->cShifted == 0x00)) { x = m_Rect.left; y += m_nKeyHeight; } else { int width = ((abs(pKey->nWidth) * m_nKeyWidth) / 15); CRect rcKey(x,y,x + width, y + m_nKeyHeight); x += width; if(pKey->nWidth < 0) { rcKey.right = rc.right; } if(m_cChar!=0x00 &&(pKey->cNormal==m_cChar || pKey->cShifted==m_cChar)) { nFlag=1; } else { nFlag=0; } DrawKey(pDC, rcKey, pKey, nFlag); } } pDC->SetBkMode(nBM); } void CKeyboard::Init(CRect &rc) { m_Rect=rc; CalcWidthHeight(); }